﻿using System;
using System.Collections.Generic;
using System.Linq;
using Common;
using Entidades.Models;

namespace Web.Helpers
{
    public class SecurityHelper
    {
        #region Public Methods
        public static string GetDefaultPage(int idTipoUsuario, int? idCategoriaUsuario = null)
        {
            var pagina = WellKnownKeys.Page.Names.LOGIN;
            try
            {
                if (idCategoriaUsuario.HasValue &&
                    idCategoriaUsuario == WellKnownKeys.Entities.CategoriasUsuario.FREELANCE.Id)
                {
                    pagina = WellKnownKeys.Page.Names.PAGOS;
                }
                else
                {
                    var paginasDefault = new Dictionary<int, string>
                    {
                        { WellKnownKeys.Entities.TiposUsuario.MANAGER.Id, WellKnownKeys.Page.Names.PROYECTOS },
                        { WellKnownKeys.Entities.TiposUsuario.PRODUCTOR.Id, WellKnownKeys.Page.Names.PROYECTOS },
                        { WellKnownKeys.Entities.TiposUsuario.ACTOR.Id, WellKnownKeys.Page.Names.PAGOS },
                        { WellKnownKeys.Entities.TiposUsuario.ADAPTADOR.Id, WellKnownKeys.Page.Names.PROYECTOS },
                        { WellKnownKeys.Entities.TiposUsuario.DIRECTOR.Id, WellKnownKeys.Page.Names.PROYECTOS },
                        { WellKnownKeys.Entities.TiposUsuario.EDITOR.Id, WellKnownKeys.Page.Names.PROYECTOS },
                        { WellKnownKeys.Entities.TiposUsuario.MEZCLADOR.Id, WellKnownKeys.Page.Names.PROYECTOS },
                        { WellKnownKeys.Entities.TiposUsuario.OPERADOR.Id, WellKnownKeys.Page.Names.PROYECTOS },
                        { WellKnownKeys.Entities.TiposUsuario.TRADUCTOR.Id, WellKnownKeys.Page.Names.PROYECTOS }
                    };
                    if( idTipoUsuario != WellKnownKeys.Entities.DEFAULT_ID )
                        paginasDefault.TryGetValue( idTipoUsuario, out pagina );
                }
            }
            catch (Exception)
            {
                throw;
            }
            return pagina;
        }
        public static bool IsLoginPage()
        {
            return WebHelper.Pages.GetPageName() == WellKnownKeys.Page.Names.LOGIN;
        }
        public static void ValidatePageAccess()
        {
            var redirect = false;

            var pageName = WebHelper.Pages.GetPageName();
            
            var currentSession = SessionHelper.GetCurrentSessionInfo();
            if (currentSession == null)
            {
                if (!IsLoginPage())
                    redirect = true;
            }
            else
            {
                var currentUser = currentSession.User;
                #region Validar Permisos Página
                switch ( pageName )
                {
                    case WellKnownKeys.Page.Names.IMPORTACION:
                        redirect = ValidatePermission_Importacion(currentUser);
                        break;
                    case WellKnownKeys.Page.Names.CONFIGURACION:
                        redirect = ValidatePermission_Configuracion(currentUser);
                        break;
                    case WellKnownKeys.Page.Names.DEFAULT:
                        redirect = ValidatePermission_Default(currentUser);
                        break;
                    case WellKnownKeys.Page.Names.FACTURACION:
                        redirect = ValidatePermission_Facturacion(currentUser);
                        break;
                    case WellKnownKeys.Page.Names.GUION:
                        redirect = ValidatePermission_Guion(currentUser);
                        break;
                    case WellKnownKeys.Page.Names.LIQUIDACION:
                        redirect = ValidatePermission_Liquidacion(currentUser);
                        break;
                    case WellKnownKeys.Page.Names.PAGOS:
                        redirect = ValidatePermission_Pagos(currentUser);
                        break;
                    case WellKnownKeys.Page.Names.PLANILLA_DE_PAGO_ACTORES:
                        redirect = ValidatePermission_PlanillaDePagoActores(currentUser);
                        break;
                    case WellKnownKeys.Page.Names.PLANILLA_DE_PAGO_STAFF:
                        redirect = ValidatePermission_PlanillaDePagoStaff(currentUser);
                        break;
                    case WellKnownKeys.Page.Names.PLANILLA_DE_CREDITOS:
                        redirect = ValidatePermission_PlanillaDeCreditos(currentUser);
                        break;
                    case WellKnownKeys.Page.Names.PROYECTO:
                        redirect = ValidatePermission_Proyecto(currentUser);
                        break;
                    case WellKnownKeys.Page.Names.PROYECTOS:
                        redirect = ValidatePermission_Proyectos(currentUser);
                        break;
                    case WellKnownKeys.Page.Names.RECLAMOS:
                        redirect = ValidatePermission_Reclamos(currentUser);
                        break;
                    case WellKnownKeys.Page.Names.USUARIO:
                        redirect = ValidatePermission_Usuario(currentUser);
                        break;
                    case WellKnownKeys.Page.Names.USUARIOS:
                        redirect = ValidatePermission_Usuarios(currentUser);
                        break;
                }
                #endregion
            }

            if ( !redirect )
                return;

            var pagina = currentSession != null
                ? Helpers.SecurityHelper.GetDefaultPage(currentSession.User.IdTipo, currentSession.User.IdCategoria)
                : Helpers.SecurityHelper.GetDefaultPage(WellKnownKeys.Entities.DEFAULT_ID);

            RedirectUser( pagina );
        }
        public static void RedirectUserToLoginPage()
        {
            RedirectUser(WellKnownKeys.Page.Names.LOGIN);
        }
        public static void RedirectUser(string url)
        {
            Helpers.WebHelper.GetCurrentContext().Response.Redirect( url, true );
        }
        public static bool ValidateUserType(UsuarioInfo user, int tipoUsuario)
        {
            return user.IdTipo == tipoUsuario;
        }
        public static bool IsManager(UsuarioInfo user)
        {
            return ValidateUserType(user, WellKnownKeys.Entities.TiposUsuario.MANAGER.Id);
        }
        public static bool HasManagerRights(UsuarioInfo user = null)
        {
            var currentUser = user ?? SessionHelper.GetCurrentSessionInfo().User;
            if (currentUser == null)
                return false;

            var adminTypeIds = new int[]
            {
                WellKnownKeys.Entities.TiposUsuario.MANAGER.Id,
                WellKnownKeys.Entities.TiposUsuario.PRODUCTOR.Id
            };

            return adminTypeIds.Contains(currentUser.IdTipo);
        }
        #endregion

        #region Private Methods
        private static bool ValidatePermission_Default(UsuarioInfo usuario)
        {
            return true;
        }
        private static bool ValidatePermission_Importacion(UsuarioInfo usuario)
        {
            var redirect = false;
            switch ( usuario.IdTipo )
            {
                case WellKnownKeys.Entities.TiposUsuario.MANAGER.Id:
                case WellKnownKeys.Entities.TiposUsuario.PRODUCTOR.Id:
                case WellKnownKeys.Entities.TiposUsuario.TRADUCTOR.Id:
                    break;
                default:
                    redirect = true;
                    break;
            }
            return redirect;
        }
        private static bool ValidatePermission_Proyecto(UsuarioInfo usuario)
        {
            var redirect = false;
            var idProyecto = Helpers.WebHelper.Pages.QueryString.GetParameter(WellKnownKeys.Page.Parameters.ID_PROYECTO);
            switch ( usuario.IdTipo )
            {
                case WellKnownKeys.Entities.TiposUsuario.MANAGER.Id:
                case WellKnownKeys.Entities.TiposUsuario.PRODUCTOR.Id:
                    break;
                case WellKnownKeys.Entities.TiposUsuario.DIRECTOR.Id:
                case WellKnownKeys.Entities.TiposUsuario.OPERADOR.Id:
                    if ( string.IsNullOrEmpty(idProyecto) )
                        redirect = true;
                    break;
                default:
                    redirect = true;
                    break;
            }
            return redirect;
        }
        private static bool ValidatePermission_Proyectos(UsuarioInfo usuario)
        {
            var redirect = false;
            switch ( usuario.IdTipo )
            {
                case WellKnownKeys.Entities.TiposUsuario.MANAGER.Id:
                case WellKnownKeys.Entities.TiposUsuario.PRODUCTOR.Id:
                case WellKnownKeys.Entities.TiposUsuario.ADAPTADOR.Id:
                case WellKnownKeys.Entities.TiposUsuario.DIRECTOR.Id:
                case WellKnownKeys.Entities.TiposUsuario.EDITOR.Id:
                case WellKnownKeys.Entities.TiposUsuario.MEZCLADOR.Id:
                case WellKnownKeys.Entities.TiposUsuario.TRADUCTOR.Id:
                case WellKnownKeys.Entities.TiposUsuario.OPERADOR.Id:
                    break;
                default:
                    redirect = true;
                    break;
            }
            return redirect;
        }
        private static bool ValidatePermission_Guion(UsuarioInfo usuario)
        {
            var redirect = false;
            var idGuion =  Helpers.WebHelper.Pages.QueryString.GetParameter(WellKnownKeys.Page.Parameters.ID_GUION);

            //WellKnownKeys.Entities.TiposUsuario.ACTOR             => NUNCA
            //WellKnownKeys.Entities.TiposUsuario.ADAPTADOR         => NUNCA
            //WellKnownKeys.Entities.TiposUsuario.DIRECTOR          => SOLO SI ES EDICIÓN
            //WellKnownKeys.Entities.TiposUsuario.EDITOR            => NUNCA
            //WellKnownKeys.Entities.TiposUsuario.MANAGER           => SIEMPRE
            //WellKnownKeys.Entities.TiposUsuario.MEZCLADOR         => NUNCA
            //WellKnownKeys.Entities.TiposUsuario.OPERADOR          => SOLO SI ES EDICIÓN
            //WellKnownKeys.Entities.TiposUsuario.PRODUCCION        => SIEMPRE
            //WellKnownKeys.Entities.TiposUsuario.TEMPORIZADOR      => NUNCA
            //WellKnownKeys.Entities.TiposUsuario.TRADUCTOR         => SOLO SI TIENE AUTORIZACIONES PENDIENTES Y PARTICIPÓ DE LA TRADUCCION *

            if (string.IsNullOrEmpty(idGuion))
            {
                redirect = true;
            }
            else
            {
                switch (usuario.IdTipo)
                {
                    case WellKnownKeys.Entities.TiposUsuario.DIRECTOR.Id:
                    case WellKnownKeys.Entities.TiposUsuario.OPERADOR.Id:
                        break;
                    case WellKnownKeys.Entities.TiposUsuario.TRADUCTOR.Id: // * Se resuelve luego Client-Side
                        break;
                    default:
                        redirect = true;
                        break;
                }
            }

            if (HasManagerRights(usuario))
                redirect = false;

            return redirect;
        }
        private static bool ValidatePermission_Liquidacion(UsuarioInfo usuario)
        {
            var redirect = false;
            //switch ( usuario.IdTipo )
            //{
            //    case WellKnownKeys.Entities.TiposUsuario.MANAGER:
            //        break;
            //    case WellKnownKeys.Entities.TiposUsuario.DIRECTOR:
            //    case WellKnownKeys.Entities.TiposUsuario.OPERADOR:
            //        if ( string.IsNullOrEmpty(id) )
            //            redirect = true;
            //        break;
            //    default:
            //        redirect = true;
            //        break;
            //}
            return redirect;
        }
        private static bool ValidatePermission_Facturacion(UsuarioInfo usuario)
        {
            var redirect = false;
            switch ( usuario.IdTipo )
            {
                case WellKnownKeys.Entities.TiposUsuario.MANAGER.Id:
                    break;
                default:
                    redirect = true;
                    break;
            }
            return redirect;
        }
        private static bool ValidatePermission_Pagos(UsuarioInfo usuario)
        {
            var redirect = false;
            switch (usuario.IdTipo)
            {
                case WellKnownKeys.Entities.TiposUsuario.MANAGER.Id:
                    break;
                case WellKnownKeys.Entities.TiposUsuario.ACTOR.Id:
                    break;
                default:
                    redirect = true;
                    break;
            }
            if ( usuario.IdCategoria == WellKnownKeys.Entities.CategoriasUsuario.FREELANCE.Id )
                redirect = false;
            return redirect;
        }
        private static bool ValidatePermission_PlanillaDePagoActores(UsuarioInfo usuario)
        {
            var redirect = false;
            switch ( usuario.IdTipo )
            {
                case WellKnownKeys.Entities.TiposUsuario.MANAGER.Id:
                    break;
                default:
                    redirect = true;
                    break;
            }
            return redirect;
        }
        private static bool ValidatePermission_PlanillaDePagoStaff(UsuarioInfo usuario)
        {
            var redirect = false;
            switch ( usuario.IdTipo )
            {
                case WellKnownKeys.Entities.TiposUsuario.MANAGER.Id:
                    break;
                default:
                    redirect = true;
                    break;
            }
            return redirect;
        }
        private static bool ValidatePermission_PlanillaDeCreditos(UsuarioInfo usuario)
        {
            var redirect = false;
            switch ( usuario.IdTipo )
            {
                case WellKnownKeys.Entities.TiposUsuario.MANAGER.Id:
                case WellKnownKeys.Entities.TiposUsuario.PRODUCTOR.Id:
                    break;
                default:
                    redirect = true;
                    break;
            }
            return redirect;
        }
        private static bool ValidatePermission_Reclamos(UsuarioInfo usuario)
        {
            var redirect = false;
            //switch ( usuario.IdTipo )
            //{
            //    case WellKnownKeys.Entities.TiposUsuario.MANAGER.Id:
            //        break;
            //    case WellKnownKeys.Entities.TiposUsuario.ACTOR.Id:
            //        break;
            //    default:
            //        redirect = true;
            //        break;
            //}
            return redirect;
        }
        private static bool ValidatePermission_Usuario(UsuarioInfo usuario)
        {
            var redirect = false;
            switch ( usuario.IdTipo )
            {
                case WellKnownKeys.Entities.TiposUsuario.MANAGER.Id:
                case WellKnownKeys.Entities.TiposUsuario.PRODUCTOR.Id:
                    break;
                default:
                    redirect = true;
                    var currentSession = SessionHelper.GetCurrentSessionInfo();
                    if ( currentSession != null && ( usuario.Id == currentSession.User.Id ) )
                            redirect = false;
                    break;
            }
            return redirect;
        }
        private static bool ValidatePermission_Usuarios(UsuarioInfo usuario)
        {
            var redirect = false;
            switch ( usuario.IdTipo )
            {
                case WellKnownKeys.Entities.TiposUsuario.MANAGER.Id:
                case WellKnownKeys.Entities.TiposUsuario.PRODUCTOR.Id:
                    break;
                default:
                    redirect = true;
                    break;
            }
            return redirect;
        }
        private static bool ValidatePermission_Configuracion(UsuarioInfo usuario)
        {
            var redirect = false;
            switch ( usuario.IdTipo )
            {
                case WellKnownKeys.Entities.TiposUsuario.MANAGER.Id:
                    break;
                default:
                    redirect = true;
                    break;
            }
            return redirect;
        }
        #endregion
    }
}